#include "axon.h"
#include <stdexcept>
#include "calcError.h"

axon::axon(){
    f_signal = 0.;
    b_signal = 0.;
}

axon::axon(const ntype::signal_t &fs, const ntype::signal_t &bs){
    f_signal = fs;
    b_signal = bs;
}

axon::axon(const axon &a){
    f_signal = a.f_signal;
    b_signal = a.b_signal;

    for(int icount = 0; icount < MAX_STUDY_SIGNAL_BUFFER; icount ++) {
        f_signal_study[icount] = a.f_signal_study[icount];
        b_signal_study[icount] = a.b_signal_study[icount];
    }
}

axon::~axon(void){
}

void axon::setFSignal(ntype::signal_t s){
    f_signal = s;
}

ntype::signal_t axon::getFSignal(void){
    return f_signal;
}

void axon::setBSignal(ntype::signal_t s){
    b_signal = s;
}

ntype::signal_t axon::getBSignal(void){
    return b_signal;
}

void axon::setFStudySignal(ntype::signalid_t signalid, ntype::signal_t val)
{
    if(signalid >= MAX_STUDY_SIGNAL_BUFFER)
        throw std::overflow_error("axon::setFStudySignal: signal id more then max value");

    f_signal_study[signalid] = val;
}

ntype::signal_t axon::getFStudySignal(ntype::signalid_t signalid) const
{
    if(signalid >= MAX_STUDY_SIGNAL_BUFFER)
        throw std::overflow_error("axon::getFStudySignal: signal id more then max value");
    return f_signal_study[signalid];
}

void axon::setBStudySignal(ntype::signalid_t signalid, ntype::signal_t val)
{
    if(signalid >= MAX_STUDY_SIGNAL_BUFFER)
        throw std::overflow_error("axon::setBStudySignal: signal id more then max value");
    b_signal_study[signalid] = val;
}

ntype::signal_t axon::getBStudySignal(ntype::signalid_t signalid) const
{
    if(signalid >= MAX_STUDY_SIGNAL_BUFFER)
        throw std::overflow_error("axon::getBStudySignal: signal id more then max value");
    return b_signal_study[signalid];
}

ntype::error_t axon::getError(ntype::signalid_t signalid)
{
//    ntype::signal_t diff = getFStudySignal(signalid) - getBStudySignal(signalid);
//    ntype::signal_t max_v = std::max(getFStudySignal(signalid), getBStudySignal(signalid));
//    return (diff / max_v);

    ntype::signal_t in = getFStudySignal(signalid);
    ntype::signal_t exp = getBStudySignal(signalid);
    return getSignalErrorValue(in, exp, ALLOWED_ERROR_RANGE);

}


